<?php
/**
 * 插件函数库 - JBlog
 * 
 * @copyright (c) 2008-2010 JBlog (www.lisijie.org)
 * @author lisijie <lisijie86@gmail.com>
 * @version $Id: func_plugin.php 546 2010-07-21 09:48:31Z lisijie86 $
*/

!defined('IN_JBLOG') && exit('Access Denied!');

//初始化
$_PLUGIN = array();

/**
 * 在指定的标记添加过滤器
 * 
 * @param string $tag 标记
 * @param string $func 过滤器函数名
 * @param int $args 过滤器的参数个数
 * @param int $level 优先级，数值越低的优先级越高，越先执行
 */
function add_filter($tag, $func, $args = 1, $level = 10) {
	global $_PLUGIN;
	$id = filter_create_id($func);
	$_PLUGIN[$tag][$level][$id] = array('function'=>$func, 'args' => $args);
	return true;
}

function filter_create_id($func) {
	if ( is_string($func) ) {
		return $func;
	} elseif ( is_array($func) ) {
		return implode('',$func);
	}
}

/**
 * 应用某个标记的过滤器
 * @param string $tag 要应用过滤器的标记
 * @param mixed $value 传递给过滤器的参数
 */
function apply_filter($tag, $value) {
	global $_PLUGIN;
	if ( !isset($_PLUGIN[$tag]) ) return $value;
	$args = func_get_args();
	//按优先级排序
	if ( !isset($_PLUGIN['plugin_ksort'][$tag]) ) {
		ksort($_PLUGIN[$tag]);
		$_PLUGIN['plugin_ksort'][$tag] = true;
	}
	reset($_PLUGIN[$tag]);
	do {
		foreach ( current($_PLUGIN[$tag]) as $_filter ) {
			if ( empty($_filter['function']) ) continue;
			$args[1] = $value;
			$value = call_user_func_array($_filter['function'], array_slice($args, 1, (int)$_filter['args']) );
		}
	} while ( next($_PLUGIN[$tag]) !== false );
	return $value;
}

/**
 * 添加动作
 */
function add_action($tag, $func, $args = 1, $level = 10) {
	add_filter($tag, $func, $args, $level);
}

/**
 * 执行某个标记下的动作
 */
function do_action($tag, $value = '') {
	global $_PLUGIN;
	if ( !isset($_PLUGIN[$tag]) ) return ; 
	$args = func_get_args();
	//按优先级排序
	if ( !isset($_PLUGIN['plugin_ksort'][$tag]) ) {
		ksort($_PLUGIN[$tag]);
		$_PLUGIN['plugin_ksort'][$tag] = true;
	}
	reset($_PLUGIN[$tag]);
	do {
		foreach ( current($_PLUGIN[$tag]) as $_action ) {
			if ( empty($_action['function']) ) continue;
			call_user_func_array($_action['function'], array_slice($args, 1, (int)$_action['args']) );
		}
	} while ( next($_PLUGIN[$tag]) !== false );
}
?>